import time
import pandas as pd
from .assist import *


class Analyze:
    """
        Attributes:
            have_type: 是否有考核方式(开卷，闭卷)，默认为有
            self.data_list: 需要操控的数据列表
    """
    have_type: bool = True
    data_list: pd.DataFrame = None

    '''
        :param have_type 是否有考核方式
        :param data_list 需要赋值的列表
    '''

    def __init__(self, data_list: pd.DataFrame, have_type: bool = True):
        self.have_type = have_type
        self.data_list = data_list

    '''
        添加属性
    '''

    def deal_time(self):
        # 添加最终考试日期
        self.data_list['最终考试日期'] = self.data_list['考试日期'] + \
                                   self.data_list['考试时间'].map(lambda x: ' ' + x)

        # 添加考试结束时间戳
        # 考试结束时间
        test_end_time = self.data_list['考试时间'].map(lambda x: ' ' + x.split('~')[1])
        # 考试日期
        test_date = self.data_list['考试日期'] + test_end_time
        # 最终时间戳
        test_final_timestamp = test_date.apply(
            lambda x: time.mktime(time.strptime(x, '%Y-%m-%d %H:%M')))

        self.data_list['考试时间戳'] = test_final_timestamp

    '''
        对于所有的记录, 按照老师分组, 时间排序, 地点一致, 作为合并条件进行合并
    '''

    def __deal_repeat(self):
        group_list = self.data_list.groupby(['主监考', '副监考', '最终考试日期', '考试地点'])

        res_list = None
        for key, group in group_list:
            package_num_list = [str(i) for i in group['试卷袋号']]
            student_class_list = [str(i) for i in group['学生班级']]

            group.drop('试卷袋号', axis=1, inplace=True)
            group.drop('学生班级', axis=1, inplace=True)
            group.drop_duplicates(['主监考', '副监考', '最终考试日期', '考试地点'], inplace=True)

            group['试卷袋号'] = ','.join(package_num_list)
            group['学生班级'] = ','.join(student_class_list)

            if res_list is None:
                res_list = group
            else:
                res_list = pd.concat([res_list, group])

        self.data_list = res_list

    '''
        将所有的包含多个项目的数据, 以逗号分隔, 加入数组中
        :param have_package_num 是否有试卷袋号
    '''

    def split_into_array(self, have_package_num: bool = True):
        if have_package_num:
            self.data_list['试卷袋号'] = self.data_list['试卷袋号'].apply(func=split)

        self.data_list['学生班级'] = self.data_list['学生班级'].apply(func=split)
        self.data_list['副监考'] = self.data_list['副监考'].apply(func=split)

    '''
        处理数据格式, 对于合并行或者一列值为空的情况进行处理
    '''

    def deal_data_list(self):
        # 对于领卷地点, 进行填充
        self.data_list['备注'] = self.data_list['备注'].fillna(method='ffill')

        self.__deal_repeat()
        # print(self.data_list)
        self.split_into_array()
        # 对于缺失的考试类型, 默认为闭卷
        self.data_list['备注.1'] = self.data_list['备注.1'].fillna('闭卷')

    '''
        定义要存储数据的格式
        :return {pd.DataFrame}
    '''

    def data_format(self):
        data = {
            # 试卷袋号
            'package_num': self.data_list['试卷袋号'],
            # 科目名称
            'course': self.data_list['课程名称'],
            # 课程属性: 必修 or 选修
            'property': self.data_list['课程属性'],
            # 考试班级
            'classes': self.data_list['学生班级'],
            # 考试教室
            'room': self.data_list['考试地点'],
            # 考试时间
            'time': self.data_list['最终考试日期'],
            # 主监考
            'main_teacher': self.data_list['主监考'],
            # 副监考
            'deputy_teacher': self.data_list['副监考'],
            # 结束时间戳
            'timestamp': self.data_list['考试时间戳'],
            # 领卷地址
            'place': self.data_list['备注']
        }
        # 检查是否有考核方式
        if self.have_type:
            # 考核方式: 开卷与否
            data['type'] = self.data_list['备注.1']

        return pd.DataFrame(data)
